/**
 * 
 */
package com.feib.soeasy.dao;

import java.util.List;

import com.feib.soeasy.model.Group;
import com.feib.soeasy.model.User;
import com.feib.soeasy.pagination.PaginatedList;

/**
 * @author Jimmy Liu
 * 
 */
public interface UserDao extends HibernateDao<User, Long>
{

    public static enum ROLE_CONSTRAINT
    {
        OnlyThisRole, IncludeThisRole, WithoutThisRole
    };

    public List<User> findByGroupNo(String groupNo);

    /**
     * 
     * @param userId
     * @param groupNo
     * @return
     */
    public User findByUerIdGroupNo(String userId, String groupNo);

    /**
     * 
     * @param userId
     * @param userName
     * @param groupNo
     * @param role_constraint
     * @param role
     * @param paginationConfig
     * @return
     */
    @Deprecated
    public PaginatedList<User> findByUerIdUserNameGroupNo(	String userId,
                    String userName,
                    String groupNo,
                    ROLE_CONSTRAINT role_constraint,
                    String role,
                    PaginatedList<User> paginationConfig);

    public List<String> findUserEmailByGroupMenuId(Group group, String menuId);

    /**
     * 查詢帳單業者的使用者資料
     * 
     * @param groupNo 業者代號，一定要有，完全比對
     * @param userId 使用者帳號
     * @param userName 使用者名稱
     * @param paginationConfig 分頁條件
     * @return
     */
    public PaginatedList<User> queryPaginationUsers(String groupNo, String userId, String userName, PaginatedList<User> paginationConfig);

    /**
     * 以業者代號查詢ADMINISTRATOR的USER
     * @param groupNo 業者代號，一定要有
     * @param paginationConfig 分頁條件
     * @return
     */
    public PaginatedList<User> queryPaginationForAdministratorByGroupNo(String groupNo, PaginatedList<User> paginationConfig);

    /**
     * @param group
     * @return
     */
    public int countUserByGroupExcludeAdmin(Group group);

    /**
     * @param group
     */
    public void deleteByGroup(Group group);

}
